{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Image Classification - Search Space and HPO\n",
    "\n",
    ":label:`sec_imgadvanced`\n",
    "\n",
    "\n",
    "While the :ref:`sec_imgquick` introduced basic usage of AutoGluon `fit`, `evaluate`, `predict` with default configurations, this tutorial dives into the various options that you can specify for more advanced control over the fitting process.\n",
    "\n",
    "These options include: \n",
    "- Defining the search space of various hyperparameter values for the training of neural networks\n",
    "- Specifying how to search through your choosen hyperparameter space\n",
    "- Specifying how to schedule jobs to train a network under a particular hyperparameter configuration.\n",
    "\n",
    "The advanced functionalities of AutoGluon enable you to use your external knowledge about your particular prediction problem and computing resources to guide the training process. If properly used, you may be able to achieve superior performance within less training time.\n",
    "\n",
    "**Tip**: If you are new to AutoGluon, review :ref:`sec_imgquick` to learn the basics of the AutoGluon API.\n",
    "\n",
    "We begin by letting AutoGluon know that [`ImageClassification`](/api/autogluon.task.html#autogluon.task.ImageClassification) is the task of interest:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import autogluon as ag\n",
    "from autogluon import ImageClassification as task"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Create AutoGluon Dataset\n",
    "\n",
    "Let's first create the dataset using the same subset of the `Shopee-IET` dataset as the :ref:`sec_imgquick` tutorial.\n",
    "Recall that because we only specify the `train_path`, a 90/10 train/validation split is automatically performed."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'data'"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "filename = ag.download('https://autogluon.s3.amazonaws.com/datasets/shopee-iet.zip')\n",
    "ag.unzip(filename)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "dataset = task.Dataset('data/train')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Specify which Networks to Try\n",
    "\n",
    "We start with specifying the pretrained neural network candidates.\n",
    "Given such a list, AutoGluon tries to train different networks from this list to identify the best-performing candidate.\n",
    "This is an example of a :class:`autogluon.space.Categorical` search space, in which there are a limited number of values to choose from."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Categorical['mobilenet0.25', AutoGluonObject]\n"
     ]
    }
   ],
   "source": [
    "import gluoncv as gcv\n",
    "\n",
    "@ag.func(\n",
    "    multiplier=ag.Categorical(0.25, 0.5),\n",
    ")\n",
    "def get_mobilenet(multiplier):\n",
    "    return gcv.model_zoo.MobileNetV2(multiplier=multiplier, classes=4)\n",
    "\n",
    "net = ag.space.Categorical('mobilenet0.25', get_mobilenet())\n",
    "print(net)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Specify the Optimizer and Its Search Space\n",
    "\n",
    "Similarly, we can manually specify the optimizer candidates.\n",
    "We can construct another search space to identify which optimizer works best for our task, and also identify the best hyperparameter configurations for this optimizer.\n",
    "Additionally, we can customize the optimizer-specific hyperparameters search spaces, such as learning rate and weight decay using :class:`autogluon.space.Real`."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "AutoGluonObject -- NAG\n"
     ]
    }
   ],
   "source": [
    "from mxnet import optimizer as optim\n",
    "\n",
    "@ag.obj(\n",
    "    learning_rate=ag.space.Real(1e-4, 1e-2, log=True),\n",
    "    momentum=ag.space.Real(0.85, 0.95),\n",
    "    wd=ag.space.Real(1e-6, 1e-2, log=True)\n",
    ")\n",
    "class NAG(optim.NAG):\n",
    "    pass\n",
    "\n",
    "optimizer = NAG()\n",
    "print(optimizer)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Search Algorithms\n",
    "\n",
    "In AutoGluon, :meth:`autogluon.searcher` supports different search search_strategys for both hyperparameter optimization and architecture search.\n",
    "Beyond simply specifying the space of hyperparameter configurations to search over, you can also tell AutoGluon what strategy it should employ to actually search through this space. \n",
    "This process of finding good hyperparameters from a given search space is commonly referred to as *hyperparameter optimization* (HPO) or *hyperparameter tuning*. \n",
    ":meth:`autogluon.scheduler` orchestrates how individual training jobs are scheduled.\n",
    "We currently support random search, Hyperband, and Bayesian Optimization. Although these are simple techniques, they can be surprisingly powerful when parallelized, which can be easily enabled in AutoGluon.\n",
    "\n",
    "### Bayesian Optimization\n",
    "\n",
    "Here is an example of using Bayesian Optimization using :class:`autogluon.searcher.SKoptSearcher`.\n",
    "\n",
    "Bayesian Optimization fits a probabilistic *surrogate model* to estimate the function that relates each hyperparameter configuration to the resulting performance of a model trained under this hyperparameter configuration.\n",
    "\n",
    "You can specify what kind of surrogate model to use (e.g., Gaussian Process, Random Forest, etc.), in addition to which acquisition function to employ (e.g., Expected Improvement, Lower Confidence Bound, etc.).  In the following, we tell `fit` to perform Bayesian optimization using a Random Forest surrogate model with acquisitions based on Expected Improvement.\n",
    "For more information, see :class:`autogluon.searcher.SKoptSearcher`."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Starting Experiments\n",
      "Num of Finished Tasks is 0\n",
      "Num of Pending Tasks is 2\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "scheduler: FIFOScheduler(\n",
      "DistributedResourceManager{\n",
      "(Remote: Remote REMOTE_ID: 0, \n",
      "\t<Remote: 'inproc://172.16.17.200/4297/1' processes=1 threads=8, memory=64.38 GB>, Resource: NodeResourceManager(8 CPUs, 1 GPUs))\n",
      "})\n",
      "\n"
     ]
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "34134288a89d49fb807ff5dc76ddeb73",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "HBox(children=(FloatProgress(value=0.0, max=2.0), HTML(value='')))"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/home/ec2-user/anaconda3/envs/autogluon/lib/python3.7/site-packages/mxnet/gluon/data/vision/datasets.py:318: UserWarning: Ignoring data/train/BabyPants/.ipynb_checkpoints of type . Only support .jpg, .jpeg, .png\n",
      "  filename, ext, ', '.join(self._exts)))\n",
      "Model file not found. Downloading.\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Downloading /home/ec2-user/.mxnet/models/mobilenet0.25-f0046a3d.zip from https://apache-mxnet.s3-accelerate.dualstack.amazonaws.com/gluon/models/mobilenet0.25-f0046a3d.zip...\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "100%|██████████| 1093/1093 [00:00<00:00, 2236.34KB/s]\n"
     ]
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "802477923d754e45a5f7f62f9911f8e8",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "VBox(children=(HBox(children=(IntProgress(value=0, max=2), HTML(value=''))), HTML(value='')))"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Finished Task with config: {'net.1.multiplier.choice': 0, 'net.choice': 0, 'optimizer.learning_rate': 0.001, 'optimizer.momentum': 0.9, 'optimizer.wd': 0.0001} and reward: 0.39375\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/home/ec2-user/anaconda3/envs/autogluon/lib/python3.7/site-packages/mxnet/gluon/data/vision/datasets.py:318: UserWarning: Ignoring data/train/BabyPants/.ipynb_checkpoints of type . Only support .jpg, .jpeg, .png\n",
      "  filename, ext, ', '.join(self._exts)))\n"
     ]
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "988914990abd47a4a554c7f62eb6e41a",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "VBox(children=(HBox(children=(IntProgress(value=0, max=2), HTML(value=''))), HTML(value='')))"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Finished Task with config: {'net.1.multiplier.choice': 1, 'net.choice': 0, 'optimizer.learning_rate': 0.0017422510893267207, 'optimizer.momentum': 0.8987009414070393, 'optimizer.wd': 0.0001198611701580152} and reward: 0.45\n",
      "/home/ec2-user/anaconda3/envs/autogluon/lib/python3.7/site-packages/mxnet/gluon/data/vision/datasets.py:318: UserWarning: Ignoring data/train/BabyPants/.ipynb_checkpoints of type . Only support .jpg, .jpeg, .png\n",
      "  filename, ext, ', '.join(self._exts)))\n"
     ]
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "d49fa69a3dc24f6da0e7b5d26d740c18",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "VBox(children=(HBox(children=(IntProgress(value=0, max=2), HTML(value=''))), HTML(value='')))"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Saving Training Curve in checkpoint/plot_training_curves.png\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYkAAAEWCAYAAACT7WsrAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+j8jraAAAgAElEQVR4nO3deXhU5dnH8e+dhLCFfScLIPsuMOC+oSiCgohQt1btQm21r2+tVtv6Wqtd1FasWlqLVutSC4lWpYrVakUWt0zYN2WVmbCENSRA9vv94zmRaUwgA5lMZnJ/rouLOevcZ+ZMfvOc58w5oqoYY4wx1UmIdgHGGGMaLgsJY4wxNbKQMMYYUyMLCWOMMTWykDDGGFMjCwljjDE1spBoAESki4gsFJECEXkk2vU0NiJynYi8U9fz1hUR+amIPF0Pz5MhIoUikhjp56otEdkqIhdFu466EOZ+dp+IvBjpmmrDQuIEeTvvEe9DtUtE/ioiKSe4uhnAHqC1qv6oDsuMWyLypPfaF4pIiYiUhgy/Fc66VPVvqnpxXc9bW8fbFlX9tap+uy6fszqquk1VU1S1PNLPFQkicqOILK5m/JdB481T7r22B0VkuYhcFjJvWxH5k4jsFJHDIrJKRG6q4fkyQt6nQhFRETkUMnxO6PyR2Hfqg4XEyblcVVOAkYAPuCechcVJAHoAa/UEftkoIknhLhMPVPVm7w9aCvBrYG7lsKpeWjlfLLw+td0WU2c+8l7rtsBfgEwRaSciycC7uM/jGUAb4E7gQRG5vepKQkK18r0DGB4yblHlvLGwH9bEQqIOqGou8BYwBEBETheRD0XkgIisEJHzK+cVkQUi8isRWQIcBp4HbgB+7H37uEhEmorI70Vku/fv9yLS1Fv+fBEJishdIrITeNZrmmaJyIveIatVItJPRH4iInkiEhCRi0NquElE1nnzbhaR74ZMq1z/j7xld4R+kxKR5iLyiIh8ISL5IrJYRJofb7tDebW/XGXcYyLyuPf4Rq+uAhHZIiLXhfN+eN8c7xKRlcAhEUkSkbtFZJO3zrUiMiVk/v/6Bup9I7xZRDZ42zJLROQE5k30Xqs93nbc6s0f1h8MCTn0ICI9vXXc5L2v+73nHy0iK70a/lBl+W967/d+EXlbRHrU8Dw9Q+vz9tUHRGSJ97q9IyIdj1HnZeK+mR/w9oNhIdNqfP296d8J2SfXisjIkMmnetuWLyJzRaRZOK9fTVS1AngGaA70Br4OZADTVHWLqpaq6r+A/wHuF5HWtV23t58sEZFHRWQvcF81+85j3nt4UERypErLo8FQVft3Av+ArcBF3uN0YA3wAJAK7AUm4EJ4nDfcyZt3AbANGAwkAU2AvwK/DFn3/cDHQGegE/Ah8IA37XygDHgIaIrbwe8DioBLvHU+D2wBfuat/zvAlpD1T8R9KAQ4DxdWI6us/35v2Qne9Hbe9FneNqQCicCZXh3H3O4qr10Pb52tvOFEYAdwOtASOAj096Z1AwYf5724D3ixynuz3HtfmnvjpgHdvdq+BhwCunnTbgQWhyyvwBu4b5oZwG5g/AnMezOwFkgD2uG+pSqQVNttqToO6Omt40mgGXCx996/httfUoE84Dxv/snARmCgt2/cA3xYw3NXrjspZF/dBPTD7WcLgAdrWHaE97ynee/nDd770LQWr/80IBcYjdsn+wA9Qt7LT71l2wPrgJtrqOG/3psaPqtfzuO9HrcBBbhWwxzguWqWT8J9Ji45zn6oQJ+Q5ykDfuAt37yafed6oIM3/UfATqBZTftBtP5ZS+LkvCYiB4DFwAe4QwXXA/NVdb6qVqjqvwE/7o9npb+q6hpVLVPV0mrWex1wv6rmqepu4Be4bzmVKoCfq2qxqh7xxi1S1bdVtQzIwoXLg9765wA9RaQtgKq+qaqb1PkAeAcI/RZT6j1/qarOBwqB/uIOjX0TuE1Vc1W1XFU/VNXiWm433vN/ASwFKr9NjgUOq+rHIds3RESaq+oOVV1T0xtwDI+raqDy9VHVLFXd7tU2F9gAjDnG8g+q6gFV3Qa8D5x6AvNOBx5T1aCq7gcePIHtqMkDqlqkqu/g/uD+3dtfcoFFuD/a4ILqN6q6zts3fo37Zl5ta6Iaz6rq597rmEnNr8MM4M+q+om3XzwHFOOC/3iv/7eBh1U129snN3r7SKXHvWX3Af88Rg0Ap3stmS//4cL7K/Pg/ihfA0xR1XygI+7Lyn/xXrc93vRwbFfVJ7zP+ZGqE1X1RVXd601/BPdlq3+YzxFxFhIn5wpVbauqPVT1+96O0AOYVmUnPRv3jbhS4Djr7Q6Efki+8MZV2q2qRVWW2RXy+AiwR492QFbuoCkAInKpiHwsIvu8+ibw3x+Avd4Ho9Jhb9mOuG+vm6qpuTbbHeol3AcU4FpvGFU9hPumeTOwQ0TeFJEBNazjWP7rNRaRb4QcCjmAOzR4rA/9zpDHldsf7rzdq9Tx5WMROUeOdnCeSAhWfb+rDlfW0AN4LGS79+G+rafW8nlq+zr0AH5U5f1Px9tvj/P6p1P9PhVuDQAfe5/JL//hWu7VzdNRVU9X1Xe98XuoZn/1Dr919KaH45ifcxG5wzvElu+9Jm0IP4gizkKi7gWAF6rsqC1VNfRb5PE6qLfjPnSVMrxxtV2+RuL6Nl4Bfgd08T5E83F/OI5nD+7QRu9qptVmu0NlAeeLSBquRfFS5QSvRTQO94FdDzxVy80L9eVr5H1rfgq4FejgbfNqarfNJ2MH7lBTpfQvi1NdpEc7OAdHsIYA8N0q70tzVf0wAs/zqyrP00JV/16L1z9A9ftUfXsXuFREWlYZPxXXKvr4q4scU42fU6//4ce41mY77zXJJ/L7ZNgsJOrei8DlInKJ13HZTFxncNpxlzzq78A9ItLJ6yi811tvXUjGNWt3A2UicinuuPZx6dGOvpki0t3bvjO84Alru73DaAuAZ3H9Jevgy9+MTPY+qMW4Q10VJ7XFrp9DcduMuI74ISe5ztrIBG4TkVTvUN9d9fCcVT0J/EREBgOISBsRmRaB53kKuFlEThOnpYhMFJFWHP/1fxq4Q0RGecv2CeNwWF16AQgCWeI68ZuIyCXA48B93iGputIK12exG0gSkXuBWneM1ycLiTqmqgFcZ+FPcTtAAHcaXTiv9S9xx/NXAqtwx+9/WUf1FeDO1sgE9uMO9cwLYxV3eDVl4w5dPAQknOB2vwRcREgrwpv/dlzLaR+uY/17YdT3Faq6FngE+Ah3WGYosORk1llLT+H6e1YCy3AttjKg3n6HoKqv4t6jOSJyEPcNvs5Pq1VVP+4EiT/g9quNuI7a477+qpoF/Aq3HxTgOuHb13WNx+P1rV2E23c/wZ1AMRP4mar+to6f7m3gX8DnuMPJRRz/MHRUiKrddMiY+uC12p5U1Wh8SzbmhFhLwpgIEfebkgnifqeRCvwceDXadRkTDmtJGBMhItICd2r0ANwZR2/iTh8+GNXCjAmDhYQxxpga2eEmY4wxNYrZi05Vp2PHjtqzZ89ol2GMMTElJydnj6p2qm5aXIVEz5498fv90S7DGGNiioh8UdM0O9xkjDGmRhYSxhhjamQhYYwxpkYWEsYYY2pkIWGMMaZGFhLGGGNqZCFhjDGmRhYSxhgTy0qPwEd/hC0LI7L6uPoxnTHGNBqlR8D/LCz5PRTugtO/D73OrfOnsZAwxphYUnoEcv4Kix914dDrXLjqWeh5VkSezkLCGGNiQWlRSDjshJ7nwFXPQM+zI/q0FhLGGNOQlRbB0udcOBTsgB5nw9Snodc59fL0FhLGGNMQlRbB0udh8UwvHM6CK5+qt3CoZCFhjDENSWkRLHsBFs2Egu2QcSZcOdsdXhKp93IsJIwxpiEoK3Ythy/D4QyY8qTrmI5COFSykDDGmGgqKz7acjiYC+mnw5Q/Qa/zohoOlSwkjDEmGsqKYdmLXjgEIf00mDwLTjm/QYRDJQsJY4ypT2UlsPxFWPiIC4e0MTD5CTjlggYVDpUsJIwxpj6UlcDyv8GiRyA/AGmjYdLj0HtsgwyHShG/dpOIjBeRz0Rko4jcfYz5poqIioivyvgMESkUkTsiXasxxtS5shL3I7gnRsEb/wspXeD6V+Bb/4Y+FzbogIAItyREJBGYBYwDgkC2iMxT1bVV5msF3AZ8Us1qZgJvRbJOY4ypc+WlsPwlWPQ7OLANUn1w2aMxEQyhIn24aQywUVU3A4jIHGAysLbKfA8ADwF3ho4UkSuALcChCNdpjDF14yvhMAomzoQ+F8VUOFSKdEikAoGQ4SBwWugMIjISSFfVN0XkzpDxKcBduFaIHWoyxjRs5aWw4u+w8LcuHLqPhAmPQN9xMRkOlaLacS0iCbjDSTdWM/k+4FFVLZRjvMAiMgOYAZCRkVH3RRpjzLGUl8KKOV44fAHdR8CE30Hfi2M6HCpFOiRygfSQ4TRvXKVWwBBggRcEXYF5IjIJ1+K4SkQeBtoCFSJSpKp/CH0CVZ0NzAbw+XwaqQ0xxpj/Ul4GK71w2L8Vup0Klz4M/S6Ji3CoFOmQyAb6ikgvXDhcDVxbOVFV84GOlcMisgC4Q1X9wDkh4+8DCqsGhDHG1LvyMlg51wuHLS4crpkbd+FQKaIhoaplInIr8DaQCDyjqmtE5H7Ar6rzIvn8xhhTZ8rLYFUmfPCwFw7D4Zo50G98XIZDJVGNnyM0Pp9P/X5/tMswxsST8jJYlQULH4Z9m6HrMDj/J9D/0rgJBxHJUVVfddPsF9fGGFOd8jJY/bJrOezbBF2HwtUvQf8JcRMOtWEhYYwxoSrKYdXLruWwdyN0GQpf+xsMmNiowqGShYQxxoALh9WvwAcPeeEwBL72IvSfCAkRv4JRg2UhYYxp3CrKYfU/vHDYAJ0Hw/QXYMBljTocKllIGGMap4pyWPOqC4c9n0PnQTD9eRhwuYVDCAsJY0zj8mU4PAx7PnPhMO05GDjJwqEaFhLGmMahogLWeuGwez10GgjT/goDJ1s4HIOFhDEmvlVUwNrX3GGl3euh0wC46lkYdIWFQy1YSBhj4lNFBax7HRY8BLvXQcf+cNUzMGiKhUMYLCSMMfGlogLWzXMth7y1Lhym/gUGT4GExGhXF3MsJIwx8eEr4dDPwqEOWEgYY2JbRQWs/6c7rJS3Bjr0hSufhiFXWjjUAQsJY0xsqqiA9W+4lsOu1dChD1z5FAyZauFQhywkjDGxRdWFw4KHYNcqaN8bpsyGoVdZOESAhYQxJjaowvo34YMHYWdlOPwZhlwFifanLFLslTXGNGyq8Nl8WPAg7FwJ7U+xcKhH9gobYxomVfjsLVjwm6PhcMWTMHSahUM9slfaGNOwqMLn/3LhsGMFtOsFV/wJhk63cIgCe8WNMQ2DKnz+thcOy6FdT5j8Rxj2NQuHKLJX3hgTXaqw4R0XDtuXQdseMHmWFw5Nol1doxfxC5iIyHgR+UxENorI3ceYb6qIqIj4vOFxIpIjIqu8/8dGulZjTD1Shc/fgafGwkvT4fA+mPQH+EEOjLjeAqKBiGhLQkQSgVnAOCAIZIvIPFVdW2W+VsBtwCcho/cAl6vqdhEZArwNpEayXmNMPVCFje+6lkNuDrTNgElPwPBrLBgaoEgfbhoDbFTVzQAiMgeYDKytMt8DwEPAnZUjVHVZyPQ1QHMRaaqqxZEt2RgTEaqw8T0vHPzQJgMuf9yFQ1JytKszNYh0SKQCgZDhIHBa6AwiMhJIV9U3ReROqjcVWFpdQIjIDGAGQEZGRp0UbYypQ6qw6T33O4dgNrRJh8sfg+HXWjjEgKh2XItIAjATuPEY8wzGtTIurm66qs4GZgP4fD6t+yqNMSdEFTb9xwuHT104XPZ7OPU6C4cYEumQyAXSQ4bTvHGVWgFDgAUiAtAVmCcik1TVLyJpwKvAN1R1U4RrNcbUBVXY/L4Lh8An0DoNLnsUTr3ewiEGRToksoG+ItILFw5XA9dWTlTVfKBj5bCILADu8AKiLfAmcLeqLolwncaYk6UKmxd44fCxC4eJM92ZSklNo12dOUERDQlVLRORW3FnJiUCz6jqGhG5H/Cr6rxjLH4r0Ae4V0Tu9cZdrKp5kazZGBOmr4RDKkx8BEZ83cIhDohq/BzG9/l86vf7o12GMY2DKmz5wIXDto+gVXc453YY+Q0LhxgjIjmq6qtumv3i2hgTHlXYstALhw9dOEz4nYVDnDpuSIjIKqDG5oaqDqvTiowxDdeWRe53Dl8sgVbd4NLfunBo0izalZkIqU1L4jLv/1u8/1/w/r+u7ssxxjRIWxfD+7+BLxZDSle49GEYeYOFQyNw3JBQ1S/AXUtJVUeETLpbRJYCNV6PyRgT47YucS2HrYtcOIx/CEbdaOHQiITTJyEiclbl6agicib1cIFAY0wUfPEhvP9rLxy6eOFwAzRpHu3KTD0LJyS+CTwrIm284QPeOGNMvPjiI1jwa9cxndIFxj/otRwsHBqrWoWEdzXX81R1eGVIeD+EM8bEgy8+coeVtnwALTvDJb8B300WDqZ2IaGq5SJyDfCohYMxcWTbxy4cNi/wwuHXMOomSG4R7cpMAxHO4aYlIvIHYC5wqHKkqi6t86qMMZG17RMvHN6Hlp3g4l+B75sWDuYrwgmJU73/7w8Zp4DdMc6YWBH41IXDpv9Ai45w8S+9cGgZ7cpMA1XrkFDVCyJZiDEmggLZXji858Jh3AMw+lsWDua4wrosh4hMBAYDX54krar317yEMSaqgn4XDhvfhRYdYNz9MPrbFg6m1modEiLyJNACuAB4GrgK+DRCdRljTkYwxwuHf7twuOgXLhyapkS7MhNjwmlJnKmqw0Rkpar+QkQeAd6KVGHGmBMQzIEPHoQN70Dz9nDRfTD6OxYO5oSFExJHvP8Pi0h3YC/Qre5LMsaELTcHFjwEG9524XDhz2HMDAsHc9LCCYk3vLvF/RZYijuz6amIVGWMqZ3cpe6S3Rvehubt4MJ7vXBoFe3KTJwI5+ymB7yHr4jIG0Az+2GdMVGyfZkLh8//5cJh7P/Bad+1cDB1LpyO68XAB8AiYIkFhDFRsH25Fw5vQbO2MPYeGPNdaNY62pWZOBXO4aavA+cAU4HfikgxsEhVfxiRyowxR+1Y4cLhs/nQrA1ccI9rOVg4mAgL53DTFhEpAkq8fxcAAyNVmDEG2LHSC4c3vXD4mRcObY6/rDF1oNb3gxCRTcBrQBfgL8AQVR1fi+XGi8hnIrJRRGq8QZGITBURFRFfyLifeMt9JiKX1LZWY2LejpUw5zr48znurnDn/xT+dxWc92MLCFOvwjnc9DhwNnANMAL4QEQWquqmmhbwLjE+CxgHBIFsEZmnqmurzNcKuA34JGTcIOBq3C+8uwPvikg/VS0Po2ZjYsvOVa7lsP4NaNoGzv8JnHYzNG8b7cpMIxXO4abHgMdEJAW4CbgPSAMSj7HYGGCjqm4GEJE5wGRgbZX5HgAeAu4MGTcZmKOqxcAWEdnore+j2tZsTMzYudr9CG7dP6Fpazjvbjj9exYOJurCObvpEVxLIgX4ELgXd6bTsaQCgZDhIHBalfWOBNJV9U0RubPKsh9XWTa1mrpmADMAMjIyarUtxjQYO1fDBw/Bunkh4XCzO63VmAYgnMNNHwEPq+quunpyEUkAZgI3nug6VHU2MBvA5/Np3VRmTITtWuPCYe3rXjjc5bUcLBxMwxJOSPwDuFZEeqnqAyKSAXRV1WNd5C8XSA8ZTvPGVWoFDAEWiAhAV2CeiEyqxbLGxJ5da71weA2SW8G5P3bh0KJ9tCszplrhhMQsoAJ3k6EHgALgFWD0MZbJBvqKSC/cH/irgWsrJ3o/yOtYOSwiC4A7VNUvIkeAl0RkJq7jui921VkTq/LWuXBY8xokp8C5d8Lp37dwMA1eOCFxmqqOFJFlAKq6X0SSj7WAqpaJyK3A27gO7mdUdY2I3A/4VXXeMZZdIyKZuE7uMuAWO7PJxJy89V44vOru4XDOj+CMWywcTMwIJyRKvVNaFUBEOuFaFsekqvOB+VXG3VvDvOdXGf4V8KswajSmYchbDwsfhtX/8MLhdjjjVgsHE3PC/Z3Eq0BnEfkV7qZD90SkKmNi1e7P4IOHYfUr0KQFnP1DFw4tO0S7MmNOSK1CwjsLaQvwY+BCQIArVHVdBGszJnbs/ty1HFa97IXD/8IZP7BwMDGvViGhqhUiMktVRwDrI1yTMbFjzwav5fAyJDWHs26DM38ALTsef1lj6sDq3Hyy/AF8Pdtz+fDudb7+cA43vSciU4F/qKr9HsE0bns2wMLfwqosSGrmguHM/7FwMPVi/6ESXl+eS6Y/yNodB0lOSqBjStOIPFc4IfFd4HagzLsarACqqnatYtN47NnoHVbywuGMW13rwcLBRFh5hbJk4x4y/QHeWbOLkvIKhqS25v7Jg5k8PJU2LZpE5HnDuXbTMW95JSKDVXXNyZdkTAO0d5M7rLQqExKbutNYz7wNUjpFuzIT5wL7DpPlD/ByTpDt+UW0bdGEa0/LYJovjcHdI39F4HBaEsfzAjCyDtdnTPTt3eQOK62c68Lh9O+7lkNK52hXZuJYUWk5/1q9k0x/gA837UUEzunbiZ9OHMhFA7vQrMmxrqtat+oyJKQO12VMdO3dBAt/54VDsoWDiThVZVVuPpn+AK8v305BURnp7Zvzo3H9mDoqje5tm0elrroMCevMNrFv32YXDivmQGITdy+Hs26DVl2iXZmJU/sOlfDqslyy/AHW7yygaVICE4Z2Y5ovjdN7dSAhIbrfv+syJIyJXfu2eOHwdy8cvgtn/a+Fg4mI8gpl4YbdZPkD/HvtLkrLleFpbfjlFUO4fHh32jSPTCf0iajLkCipw3UZUz/2b3V9Dsv/DglJMGaG+yFcq67RrszEoS/2HiLLH+TlnCA7DxbRvmUy3zijJ9N8aQzo2jBPFA0rJEQkFegRupyqLvT+P71uSzMmgvZvPdpykEQY8x3XcmjdLdqVmThzpKSc+at2kOkP8MmWfSQInNevEz+/fBAXDuxCclJCtEs8pnDuTPcQ8DXcVVkrr8aqwMII1GVMZOz/Ahb9Dpa/5MJh9LctHEydU1WWBw6Q6Q/yzxXbKSwuo0eHFtx5SX+mjkyja5tm0S6x1sJpSVwB9PfuOW1MbNn/BSx6BJb/zYWD71vusFLrur+MgWm89hQW89qyXDL9AT7fVUjzJolMGNqN6b40xvRqj3dztZgSTkhsBpoAFhImdhzY5sJh2YsgCeD7prsyq4WDqSNl5RV88PluMv0B3luXR1mFMiKjLb+5ciiXDetGq2YNpxP6RIQTEoeB5SLyHiFBoar/U+dVGXOyDgRCwkFg1E0uHNqkRrsyEyc27y4kKyfIKzlB8gqK6dAymZvO6sl0Xzp9uxzzAhUxJZyQmOf9M6bhOhCAxTNh6QteONzghUNatCszceBQcRlvrtpBlj9A9tb9JCYIF/TvxDRfOmMHdKZJYsPuhD4R4Vy76TnvdqX9vFGfqWppZMoyJkz5QVg0E5Y+74ZHfsPdDc7CwZwkVWXptv1kZgd5Y+V2DpWUc0rHltw1fgBXjkylS+vY6YQ+EeGc3XQ+8BywFXcJjnQRuaHyFFhjoiI/12s5PA+qMPLrcPbt0DY92pWZGJdXUMSrS10n9Kbdh2iRnMjEod2YPjodX492MdkJfSLCOdz0CHCxqn4GICL9gL8DoyJRmDHHlJ8Lix+Fpc+5cBhxvWs5tM2IdmUmhpWWV/D++jwy/UHe/yyP8gplVI92PDy1NxOGdSOlaeO7SEU4W9ykMiAAVPVzETlut72IjAceAxKBp1X1wSrTbwZuwf32ohCYoaprvXU/jbuybBLwvKr+Jox6TTw6uN2FQ85fQSu8cPiRhYM5KRvzCsnyB3hlaS57CovpmNKUb5/Ti2mj0unTOSXa5UVVOCHhF5GngRe94esA/7EWEJFEYBYwDggC2SIyT1XXhsz2kqo+6c0/CZgJjAemAU1VdaiItADWisjfVXVrGDWbeFE1HE69zoVDux7RrszEqMLiMt5cuZ252QGWbjtAYoIwdkBnpvvSOb9/p7jshD4R4YTE93Df+CtPeV0E/PE4y4wBNqrqZgARmQNMxv1qGwBVPRgyf0uOXk1WgZYikgQ0x10bKnRe0xgc3BESDuVw6rVwzh0WDuaEqCrZW/eT6Q/w5sodHCktp3enlvx0wgCuGJFK51bx3Ql9IsI5u6kY9y1/ZhjrTwUCIcNB4LSqM4nILbhboyYDY73RL+MCZQfQAvihqu6rZtkZwAyAjAw75BA3Cna6cPA/CxVlLhzOvQPa9Yx2ZSYG7TpYxCtLg2T5g2zZc4iWyYlMPrU703zpjMxo22g6oU/EcUNCRDJVdbqIrKKae0ao6rCTLUJVZwGzRORa4B7gBlwrpBzoDrQDFonIu5WtkpBlZwOzAXw+n93TItYV7ITFv4ecZ6G8FE69xrUc2veKdmUmxpSUVfCf9Xlk+QO8/1keFQpjerXnlgv6MGFoV1okN75O6BNRm1fpNu//y05g/blA6LmIad64mswB/uQ9vhb4l/dbjDwRWQL4cJcHMfGmYBcs+T34n3HhMPwa13KwcDBh+nxXAZnZAV5dlsveQyV0btWUm8/rzTRfOr06tox2eTHnuCGhqju8h99X1btCp3lXhr3rq0t9KRvoKyK9cOFwNe6Pf+g6+qrqBm9wIlD5eBvu0NMLItISOB34/fHqNTGmYBcseQz8f/HC4WovHE6JdmUmhhwsKuWNFe5y3MsDB0hKEC4a2IWvjU7nnL4dSbJO6BMWTntrHF8NhEurGfclVS0TkVuBt3GnwD6jqmtE5H7Ar6rzgFtF5CKgFNiPO9QE7qyoZ0VkDe7He8+q6sow6jUNWWGeC4fsv0B5MQzzwqFD72hXZmKEqvLJln1k+gPMX7WDotIK+nVJ4Z6JA5kyIpUOKU2jXWJcqE2fxPeA7wOniEjoH+lWwJLjLa+q84H5VcbdG/L4tq8s5MYX4k6DNfHkK+HwNTj3TgsHU2s78o/wSk6QrJwgX+w9TKumSVw5Mo3pvnSGp7WxTug6VpuWxEvAW8BvgLtDxhdUd7aRMdUq3A0fPgafPt9bQnIAAB0vSURBVO3CYeh0OO/HFg6mVorLynlvXR6Z/gALP99NhcLpp7Tntgv7cumQbjRPTox2iXGrNn0S+UA+cA2AiHQGmgEpIpKiqtsiW6KJaYW74cPHIftpKCty4XDundCxT7QrMzFg3Y6DZPoDvLYsl/2HS+nWphm3XNCHq0al0aODdULXh3Au8Hc57jcS3YE83L2u1wGDI1OaiWmH9rhw+PQpLxymeeHQN9qVmQYu/0gp81ZsJ8sfYGUwnyaJwsWDujLNl8Y5fTuRmGCHk+pTOB3Xv8SdYfSuqo4QkQuA6yNTlolZh/YeDYfSw0fDoVO/4y9rGq2KCuXjzXuZ6w/wr9U7KS6rYEDXVtx72SCuGJFK+5bJ0S6x0QonJEpVda+IJIhIgqq+LyJ2SqpxDu2Fj56AT2Z74XAVnPtjCwdzTLkHjvCyP0hWToDg/iO0apbEdF86033pDEltbZ3QDUA4IXFARFKAhcDfRCQPOBSZskzMOLwPPnwCPp0NJYdgyFTXId2pf7QrMw1UUWk5/167i0x/gMUb96AKZ/XpwJ2X9OeSwV1p1sQ6oRuScEJiMnAE+CHuCrBtgPsjUZSJAYf3wUd/gE/+7IXDla7l0HlAtCszDdSa7flk+YO8uiyX/COldG/TjB+M7cu0UWmkt28R7fJMDcIJic7ADlUtAp4TkeZAF2BvRCozDdPhffDRLC8cCmHwFNdy6Dww2pWZBujA4RJeX76dTH+ANdsPkpyYwCVDujLdl8aZvTtaJ3QMCCcksoAzQ4bLvXGj67Qi0zAd3gcf/xE+fhJKClw4nPtj6DIo2pWZBqaiQlmyaQ+Z/iBvr9lJSVkFg7u35heTBjP51O60bWGd0LEknJBIUtWSygFVLRERe7fj3ZH9ruVQGQ6DroDz7rJwMF8R2HeYl3OCvJwTJPfAEdo0b8I1o9OZ5ktnSGqbaJdnTlA4IbFbRCZ511tCRCYDeyJTlom6I/vhoz/CJ09C8UEYNNkLB/tZjDmqqLSct9fsJNMfYMnGvYjA2X06cvelAxg3qIt1QseBcELiZtxZTX/AXXAvAHwjIlWZ6DlywDus9CcXDgMnwfl3WziYL6kqq3PdL6FfX57LwaIy0to154cX9WPqqFTS2lkndDwJ5850m4DTvdNgKy/AZ+LFkQMuGD7+ExTnw8DL4by7oeuQaFdmGoj9h0p4bXkuc7MDrN9ZQNOkBC4d0pXpvnROP6UDCdYJHZdqcxXY61X1RRG5vcp4AFQ1nNuZmoamKN8Fw0d/dOEw4DLXcug6NNqVmQagvEJZtGE3Wf4g/167i5LyCoalteGBK4YwaXh32jRvEu0STYTVpiVR2XZsFclCTD0ryned0R/Pco8HXOb6HLqd9N1oTRzYtvcwWTkBXs4JsiO/iHYtmnDd6RlM96UzsFvraJdn6lFtQqLyWs5rVTUrksWYelB00HVGf/QHFw79J8L5d0G34dGuzETZkZJy3lrt7u728eZ9JAic268T/3fZIC4c2JmmSdYJ3RjVJiQmiMjdwE9wv4swsajooPsB3Ed/gKID0H+Cazl0PzXalZkoUlVWBPPJ9Af45/LtFBSXkdG+BXdc3I+po9Lo1qZ5tEs0UVabkPgX7raiKSJyMGS8AKqq1vZsyIoOwqd/hg+9cOh3qWs5dB8R7cpMFO0tLObVZblk+gN8vquQZk0SmDCkG9NHpzOmZ3vrhDZfqs1Nh+4E7hSR11V1cj3UZOpCccHRlsOR/dBvvOuQtnBotMrKK1i4YTeZ2UHeXbeLsgrl1PS2/HrKUC4b3o3WzawT2nxVOKfAnlBAiMh44DEgEXhaVR+sMv1m4BbcZT4KgRmqutabNgz4M9AaqABGe9eOMjUpLnBXZP3wiaPhcN5dkDoy2pWZKNmy5xBZ/gCvLA2y62AxHVomc+OZPZnmS6d/VzsfxRxbbU6BXayqZ4tIAaC4w0yVjnm4SUQSgVnAOCAIZIvIvMoQ8Lykqk9680/C3f1uvIgkAS8CX1fVFSLSASgNc/saj+ICd6OfD5+AI/ug7yXusFLqqGhXZqLgcEkZ81ftJDM7wKdbXSf0+f0784tJ6Ywd0JnkpIRol2hiRG0ON53t/X8iXznGABtVdTOAiMzBXXL8y5BQ1dB+jpa4IAK4GFipqiu8+exqs9UpLoTsp2DJ4144XOx+BJdm4dDYqCpLtx0gyx/gnyu2c6iknF4dW/Lj8f2ZOjKNLq2bRbtEE4PCucd1byCoqsUicj4wDHheVQ8cY7FU3OU7KgWB06pZ9y3A7UAyMNYb3Q9QEXkb6ATMUdWHa1tv3CsuhOyn3a1CD++FPuNcn0OaL9qVmXq2u6CYV5cFyfQH2ZhXSPMmiUwc1o3pvnRG92xnd3czJyWcaze9AvhEpA8wG3gdeAmYcLJFqOosYJaIXAvcA9zg1XY27lLkh4H3RCRHVd8LXVZEZgAzADIyMk62lIav5JALhyWPeeFwkWs5pNsV2xuTsvIKFny2m7n+AO+vz6OsQhmZ0ZaHpg5l4rDupDQN56NtTM3C2ZMqVLVMRKYAT6jqEyKy7DjL5ALpIcNp3riazAH+5D0OAgtVdQ+AiMwHRgL/FRKqOhsXWvh8PiVelRyC7L944bAHel/oWg7pY6JdmalHG/MKycoJ8I+luewuKKZjSjLfOrsX03xp9OlsndCm7oUTEqUicg3uW/7l3rjjnTOXDfQVkV64cLgauDZ0BhHpq6obvMGJQOXjt4Efi0gLoAQ4D3g0jHrjQ8kh8D/jwuHQbug91rUcMr5y1M7EqcLiMuavdL+E9n+xn8QE4YL+nZnuS+OCAZ1pkmid0CZywgmJm3CXC/+Vqm7x/vC/cKwFvJbHrbg/+InAM6q6RkTuB/zevSluFZGLcGcu7ceFEKq6X0Rm4oJGgfmq+maY2xe7Sg6D/y9Hw+GUC1zLIeP0aFdm6oGqkvPFfuZmB3hz1Q4Ol5RzSqeW/OTSAUwZmUrnVtYJbeqHqIZ/hEZE2gHpqrqy7ks6cT6fT/1+f7TLODklh72Ww++9cDjftRx6nBHtykw9yDtYxCtLc8nyB9i85xAtkxO5bFh3po9OY2SGdUKbyPD6e6s96yWcs5sWAJO8ZXKAPBFZoqq3H3NBUzulR1w4LP49HMqDXue5lkOPM4+/rIlppeUV/Gd9Hln+AO9/tpvyCmV0z3bcfH5vJg7tRkvrhDZRFM7e10ZVD4rIt3Gnvv5cRBpUSyImlR4B/7Ou5VC4C3qdC+c/Z+HQCGzYVUCmP8Cry3LZU1hC51ZNmXHuKUwblcYpnVKiXZ4xQHghkSQi3YDpwM8iVE/jUXoEcv4Kix914dDzHLjqWeh5VrQrMxFUUFTKG14n9LJtB0hKEC4c2JnpvnTO69eJJOuENg1MOCFxP64DerGqZovIKRw9E8nUVmlRSDjs9MLhGeh5drQrMxGiqny6ZR9z/QHmr9pBUWkFfTuncM/EgVwxIpWOKU2jXaIxNQrnAn9ZhNxPwrvUxtRIFBWXSotg6XMuHAp2QI+zYOrT0OucaFdmImRnfhGvLA2S5Q+wde9hUpomMWVEGtN9aZya3tY6oU1MCKfjuhnwLWAw8OX5d6r6zQjUFT9Ki2Dp87B4pguHjDPhytmu78HEnZKyCt5bt4tMf4APPt9NhcJpvdrzg7F9uXRoV1okWye0iS3h7LEvAOuBS3CHnq4D1kWiqLhQWgTLXoBFM6FgO2ScAVP+7MLBvkHGnc92FjA3O8Bry3PZd6iErq2b8f3z+3DVqDR6dmwZ7fKMOWHhhEQfVZ0mIpNV9TkReQlYFKnCYlZZsWs5VIZD+ukw5U/ulFYLh7iSf6SUf67YTpY/wIpgPk0ShXGDujDNl865fTuRaHd3M3EgrMtyeP8fEJEhwE6gc92XFKPKio+2HA7mQvppcMUf3Y/hLBziRkWF8vGWvWT5g8xftYPisgr6d2nF/102iCkjUmnfMjnaJRpTp8IJidneL63/D5gHpAD3RqSqWFJWDMte9MIh6MJh8iwLhziz/cARXs4JkpUTILDvCK2aJTHNl8Z0XzpDU9tYJ7SJW+Gc3fS09/AD4JTIlBNDykpg+Yuw8BEXDmljYPIT7hpL9gcjLhSXlfPvtbvI9AdZtGE3qnBm7w78aFx/LhnclebJidEu0ZiIq83tS4952Q1VnVl35cSAshJY/jdY9AjkByBtNEx63F2d1cIhLqzdfpBMv+uEPnC4lO5tmvGDC/owzZdOevsW0S7PmHpVm5ZE5UXqq97funJc41BWAiteci2H/G2Q6oPLf+/u62DhEPPyD5fy+opcMv0BVuceJDkxgXGDu/A1Xzpn9elondCm0arNPa5/ASAizwG3Vd6u1OufeCSy5TUA5aWw/CVY9Ds4sA1SR8Flj0IfC4dYV1GhfLhpL5n+AP9as5OSsgoGdmvNfZcPYvKpqbSzTmhjwuq4HhZ6P2vvfg8jIlBTw1BeCiv+Dgt/68Kh+0iYONPdLtTCIaYF9x92ndD+ILkHjtC6WRJXj05nui+dIaltol2eMQ1KOCGRICLtVHU/gIi0D3P52PCVcBgBEx6BvuMsHGJYUWk5b6/ZSZY/yJJNewA4q3dH7rp0ABcP6kKzJtYJbUx1wvkj/wjwkYhUXr9pGvCrui8pSspLYcUcLxy+8MLhd9D3YguHGLY6N991Qi/L5WBRGaltm3PbhX2ZOjLNOqGNqYVwToF9XkT8wFhv1JWqujYyZdWzrUvg9e/D/q3Q7VS49GHod4mFQ4zaf6iE15fnkukPsnbHQZKTEhg/uCvTfemc2bsDCdYJbUythXW4yAuF+AiGUCldoHl7GP8g9Btv4RCDyiuUxRv3kOkP8O81uygpr2BIamsemDyYScNTadOiSbRLNCYmxV+fwono2AdmvB/tKswJ2Lb3MC/nBHg5J8j2/CLatmjCtadlMM2XxuDu1gltzMmKeEiIyHjgMSAReFpVH6wy/WbgFqAcKARmhB7GEpEMXOvlPlX9XaTrNQ1fUWk5b63eQWZ2kI8270UEzu3biZ9NHMRFgzrTNMk6oY2pKxENCRFJBGYB44AgkC0i86r0Zbykqk96808CZgLjQ6bPBN6KZJ2m4VNVVgZdJ/S8FdspKCojvX1zfjSuH1NHpdG9bfNol2hMXIp0S2IMsNG7ix0iMgeYTEi/hqoeDJm/JSG/4haRK4AtwKEI12kaqL2Fxby23F2Oe/3OApomJTBhaDem+9I5rVd764Q2JsIiHRKpQCBkOAicVnUmEbkFuB1Ixjt7SkRSgLtwrZA7anoCEZkBzADIyMioq7pNFJVXKAs/302mP8C763ZRWq4MT2vDr6YM4fLh3WndzDqhjakvDaLjWlVnAbNE5FrgHuAG4D7gUVUtPNZlmFV1NjAbwOfzNZ5rScWhrXsOkZUT4JWcXHYeLKJ9y2S+cUZPpvnSGNC1dbTLM6ZRinRI5ALpIcNp3riazAH+5D0+DbhKRB4G2gIVIlKkqn+ISKUmKg6XlPHWqp3M9Qf4dMs+EgTO69eJn18+iAsHdiE5KSHaJRrTqEU6JLKBviLSCxcOVwPXhs4gIn1VdYM3OBHYAKCq54TMcx9QaAERH1SVZYEDZPkD/HPFDgqLy+jZoQV3XtKfqSPT6NqmWbRLNMZ4IhoSqlomIrcCb+NOgX1GVdeIyP2AX1XnAbeKyEW426Puxx1qMnFoT2Exry51l+PekFdI8yaJXid0GmN6tbe7uxnTAIlq/BzG9/l86vf7o12GCVFWXsEHXif0e+vyKKtQRmS0ZbovncuGdaOVdUIbE3UikqOqvuqmNYiOaxN/Nu8uJNMf5JWlQXYXFNMxJZlvnt2LaaPS6Nul1fFXYIxpECwkTJ05VFzGm6t2kOUPkL11P4kJwgX9OzHNl87YAZ1pkmid0MbEGgsJc1JUlaXb9pOZHeSNlds5VFLOKR1bctf4AUwdmUrn1tYJbUwss5AwJySvoIh/eJ3Qm3cfokVyIpcNc7+EHtWjnXVCGxMnLCRMrZWWV/D++jwy/UHe/yyP8grF16MdN0/tzYRh3UhparuTMfHGPtXmuDbmFZDpD/KPpUH2FJbQMaUp3z6nF9N96fTulBLt8owxEWQhYapVUFTKmyt3kOkPsHTbAZIShLEDOjPdl855/TtZJ7QxjYSFhPmSqpK9dT9zswPMX7WDI6Xl9Omcwk8nDGDKiDQ6tWoa7RKNMfXMQsKwM7+IV5YGyfIH2Lr3MClNk7hiRHem+dIZkd7WOqGNacQsJBqpkrIK/rN+F5n+IAs+y6NCYUyv9tw6ti8ThnalRbLtGsYYC4lG5/NdBWRmB3h1WS57D5XQpXVTbj6vN9N86fTq2DLa5RljGhgLiUbgYFEp/1yxnUx/kBWBAzRJFC4a2IXpvnTO6duRJOuENsbUwEIiTlVUKJ9s2UeWP8D81TsoKq2gX5cU7pk4kCkjUumQYp3Qxpjjs5CIMzvyj/BKTpBMf5Bt+w7TqmkSV45M42u+dIaltbFOaGNMWCwk4kBxWTnvrs0j0x9g0YbdVCiccUoHfjiuL+MHd6N5cmK0SzTGxCgLiRi2bsdBMv0BXluWy/7DpXRr04xbLujDVaPS6NHBOqGNMSfPQiLG5B8pZd6K7WRmB1iVm0+TROHiQV2ZPjqds/t0JDHBDicZY+qOhUQMqKhQPtq8l0x/gH+t3klxWQUDurbi55cPYvKpqbRvmRztEo0xccpCogHLPXCEl/1BsnICBPcfoVWzJKb70pnuS2dIamvrhDbGRJyFRANTVFrOO2t3keUPsHjjHlThrD4duPOS/lwyuCvNmlgntDGm/kQ8JERkPPAYkAg8raoPVpl+M3ALUA4UAjNUda2IjAMeBJKBEuBOVf1PpOuNltW5+WT5A7y2fDv5R0pJbduc/xnbl6tGpZHevkW0yzPGNFIRDQkRSQRmAeOAIJAtIvNUdW3IbC+p6pPe/JOAmcB4YA9wuapuF5EhwNtAaiTrrW8HDpfw+vLtzM0OsHbHQZKTErhkcFem+9I4q3dHEqwT2hgTZZFuSYwBNqrqZgARmQNMBr4MCVU9GDJ/S0C98ctCxq8BmotIU1UtjnDNEVVeoSzZuIdMf4B31uyipLyCwd1bc//kwUwa3p22LawT2hjTcEQ6JFKBQMhwEDit6kwicgtwO+7Q0thq1jMVWFpdQIjIDGAGQEZGRh2UHBmBfYfJygnySk6Q3ANHaNO8CdeelsFVo9IYktom2uUZY0y1GkTHtarOAmaJyLXAPcANldNEZDDwEHBxDcvOBmYD+Hw+jXy1tVdUWs7ba3YyNzvAh5v2IgJn9+nI3ZcOYNygLtYJbYxp8CIdErlAeshwmjeuJnOAP1UOiEga8CrwDVXdFJEK65iqsio3n0x/gNeXb6egqIy0ds25fVw/po5KI7Vt82iXaIwxtRbpkMgG+opIL1w4XA1cGzqDiPRV1Q3e4ERggze+LfAmcLeqLolwnSdt36ESXluWS6Y/wPqdBTRNSuDSIV2Z7kvn9FM6WCe0MSYmRTQkVLVMRG7FnZmUCDyjqmtE5H7Ar6rzgFtF5CKgFNjP0UNNtwJ9gHtF5F5v3MWqmhfJmsNRXqEs2rCbTH+Af6/dRWm5MiytDb+8YgiXD+9Om+ZNol2iMcacFFFtUIfxT4rP51O/3x/x5/li7yGy/EFezgmy82AR7Vo0YcqINKb50hjYrXXEn98YY+qSiOSoqq+6aQ2i4zoWHCkp563VO8j0B/h48z4SBM7t14l7Lx/EhQM70zTJOqGNMfHHQuIYVJUVwXzmZgd4Y8V2CorL6NGhBXde0p8rR6bSrY11Qhtj4puFRDX2FBZ/2Qn9+a5CmjVJYMLQbkz3pTOmZ3vrhDbGNBoWEp6y8goWbthNZnaQd9ftoqxCOTW9Lb+eMpTLhnejdTPrhDbGND4WEsDCz3dzR9YK8gqK6dAymZvO6sk0Xzr9urSKdmnGGBNVFhJAjw4tGJLahum+dMYO6ExyUkK0SzLGmAbBQgLo0aElz9w4OtplGGNMg2NfmY0xxtTIQsIYY0yNLCSMMcbUyELCGGNMjSwkjDHG1MhCwhhjTI0sJIwxxtTIQsIYY0yN4up+EiKyG/jiBBfvCOypw3JigW1z42Db3DiczDb3UNVO1U2Iq5A4GSLir+mmG/HKtrlxsG1uHCK1zXa4yRhjTI0sJIwxxtTIQuKo2dEuIApsmxsH2+bGISLbbH0SxhhjamQtCWOMMTWykDDGGFOjRhcSIjJeRD4TkY0icnc105uKyFxv+ici0rP+q6xbtdjm20VkrYisFJH3RKRHNOqsS8fb5pD5poqIikjMny5Zm20Wkenee71GRF6q7xrrWi327QwReV9Elnn794Ro1FlXROQZEckTkdU1TBcRedx7PVaKyMiTflJVbTT/gERgE3AKkAysAAZVmef7wJPe46uBudGuux62+QKghff4e41hm735WgELgY8BX7Trrof3uS+wDGjnDXeOdt31sM2zge95jwcBW6Nd90lu87nASGB1DdMnAG8BApwOfHKyz9nYWhJjgI2qullVS4A5wOQq80wGnvMevwxcKCJSjzXWteNus6q+r6qHvcGPgbR6rrGu1eZ9BngAeAgoqs/iIqQ22/wdYJaq7gdQ1bx6rrGu1WabFWjtPW4DbK/H+uqcqi4E9h1jlsnA8+p8DLQVkW4n85yNLSRSgUDIcNAbV+08qloG5AMd6qW6yKjNNof6Fu6bSCw77jZ7zfB0VX2zPguLoNq8z/2AfiKyREQ+FpHx9VZdZNRmm+8DrheRIDAf+EH9lBY14X7ejyvppMoxcUVErgd8wHnRriWSRCQBmAncGOVS6lsS7pDT+bjW4kIRGaqqB6JaVWRdA/xVVR8RkTOAF0RkiKpWRLuwWNHYWhK5QHrIcJo3rtp5RCQJ10TdWy/VRUZtthkRuQj4GTBJVYvrqbZIOd42twKGAAtEZCvu2O28GO+8rs37HATmqWqpqm4BPseFRqyqzTZ/C8gEUNWPgGa4C+HFq1p93sPR2EIiG+grIr1EJBnXMT2vyjzzgBu8x1cB/1GvRyhGHXebRWQE8GdcQMT6cWo4zjarar6qdlTVnqraE9cPM0lV/dEpt07UZt9+DdeKQEQ64g4/ba7PIutYbbZ5G3AhgIgMxIXE7nqtsn7NA77hneV0OpCvqjtOZoWN6nCTqpaJyK3A27gzI55R1TUicj/gV9V5wF9wTdKNuA6iq6NX8cmr5Tb/FkgBsrw++m2qOilqRZ+kWm5zXKnlNr8NXCwia4Fy4E5VjdlWci23+UfAUyLyQ1wn9o2x/KVPRP6OC/qOXj/Lz4EmAKr6JK7fZQKwETgM3HTSzxnDr5cxxpgIa2yHm4wxxoTBQsIYY0yNLCSMMcbUyELCGGNMjSwkjDHG1MhCwpgGQkTOF5E3ol2HMaEsJIwxxtTIQsKYMInI9SLyqYgsF5E/i0iiiBSKyKPefRreE5FO3rynehfTWykir4pIO298HxF5V0RWiMhSEentrT5FRF4WkfUi8rcYvwKxiQMWEsaEwbu0w9eAs1T1VNwvl68DWuJ+5TsY+AD3S1iA54G7VHUYsCpk/N9wl+0eDpwJVF46YQTwv7h7H5wCnBXxjTLmGBrVZTmMqQMXAqOAbO9LfnMgD6gA5nrzvAj8Q0TaAG1V9QNv/HO4S5+0AlJV9VUAVS0C8Nb3qaoGveHlQE9gceQ3y5jqWUgYEx4BnlPVn/zXSJH/qzLfiV7vJvQKvOXYZ9REmR1uMiY87wFXiUhnABFp790TPAF31WCAa4HFqpoP7BeRc7zxXwc+UNUCICgiV3jraCoiLep1K4ypJfuWYkwYVHWtiNwDvOPdvKgUuAU4BIzxpuXh+i3AXXb+SS8ENnP0qpxfB/7sXbG0FJhWj5thTK3ZVWCNqQMiUqiqKdGuw5i6ZoebjDHG1MhaEsYYY2pkLQljjDE1spAwxhhTIwsJY4wxNbKQMMYYUyMLCWOMMTX6f7TN0N/i6IifAAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Top-1 val acc: 0.450\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/home/ec2-user/anaconda3/envs/autogluon/lib/python3.7/site-packages/mxnet/gluon/data/vision/datasets.py:318: UserWarning: Ignoring data/train/BabyPants/.ipynb_checkpoints of type . Only support .jpg, .jpeg, .png\n",
      "  filename, ext, ', '.join(self._exts)))\n"
     ]
    }
   ],
   "source": [
    "time_limits = 2*60\n",
    "epochs = 2\n",
    "\n",
    "classifier = task.fit(dataset,\n",
    "                      net=net,\n",
    "                      optimizer=optimizer,\n",
    "                      search_strategy='skopt', \n",
    "                      search_options={'base_estimator': 'RF', 'acq_func': 'EI'},\n",
    "                      time_limits=time_limits,\n",
    "                      epochs=epochs,\n",
    "                      ngpus_per_trial=1)\n",
    "\n",
    "print('Top-1 val acc: %.3f' % classifier.results[classifier.results['reward_attr']])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Load the test dataset and evaluate:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "c9feb960a2b14ce0941d4b3bdd47d2a3",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "VBox(children=(HBox(children=(IntProgress(value=0, max=1), HTML(value=''))), HTML(value='')))"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "Top-1 test acc: 0.547\n"
     ]
    }
   ],
   "source": [
    "test_dataset = task.Dataset('data/test', train=False)\n",
    "\n",
    "test_acc = classifier.evaluate(test_dataset)\n",
    "print('Top-1 test acc: %.3f' % test_acc)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Hyperband Early Stopping\n",
    "\n",
    "AutoGluon currently supports scheduling trials in serial order and with early stopping\n",
    "(e.g., if the performance of the model early within training already looks bad, the trial may be terminated early to free up resources).\n",
    "Here is an example of using an early stopping scheduler :class:`autogluon.scheduler.HyperbandScheduler`:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Starting Experiments\n",
      "Num of Finished Tasks is 0\n",
      "Num of Pending Tasks is 2\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "scheduler: HyperbandScheduler(terminator: HyperbandStopping_Manager(reward_attr: classification_reward, time_attr: epoch, reduction_factor: 4, max_t: 2, brackets: [Bracket: Iter 1.000: None])\n"
     ]
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "3c8ac2c4ad21497bb55c186e1e7913ba",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "HBox(children=(FloatProgress(value=0.0, max=2.0), HTML(value='')))"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Finished Task with config: {'net.1.multiplier.choice': 0, 'net.choice': 0, 'optimizer.learning_rate': 0.001, 'optimizer.momentum': 0.9, 'optimizer.wd': 0.0001} and reward: 0.4\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Finished Task with config: {'net.1.multiplier.choice': 0, 'net.choice': 0, 'optimizer.learning_rate': 0.0001546545171937746, 'optimizer.momentum': 0.8541599612024005, 'optimizer.wd': 1.4799414760115509e-06} and reward: 0.1875\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Saving Training Curve in checkpoint/plot_training_curves.png\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Top-1 val acc: 0.400\n"
     ]
    }
   ],
   "source": [
    "search_strategy = 'hyperband'\n",
    "\n",
    "classifier = task.fit(dataset,\n",
    "                      net=net,\n",
    "                      optimizer=optimizer,\n",
    "                      search_strategy=search_strategy,\n",
    "                      epochs=epochs,\n",
    "                      num_trials=2,\n",
    "                      verbose=False,\n",
    "                      plot_results=True,\n",
    "                      ngpus_per_trial=1,\n",
    "                      grace_period=1)\n",
    "\n",
    "print('Top-1 val acc: %.3f' % classifier.results[classifier.results['reward_attr']])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The test top-1 accuracy are:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "e95424e1bf334379b1e54b705f218614",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "VBox(children=(HBox(children=(IntProgress(value=0, max=1), HTML(value=''))), HTML(value='')))"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "Top-1 test acc: 0.422\n"
     ]
    }
   ],
   "source": [
    "test_acc = classifier.evaluate(test_dataset)\n",
    "print('Top-1 test acc: %.3f' % test_acc)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "For a comparison of different search algorithms and scheduling strategies, see :ref:`course_alg`.\n",
    "For more options using `fit`, see :class:`autogluon.task.ImageClassification`."
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "conda_autogluon",
   "language": "python",
   "name": "conda_autogluon"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.7"
  },
  "widgets": {
   "application/vnd.jupyter.widget-state+json": {
    "state": {
     "01d62b9e9f9444f899b4899e4798fea8": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "ProgressStyleModel",
      "state": {
       "_model_module": "@jupyter-widgets/controls",
       "_model_module_version": "1.5.0",
       "_model_name": "ProgressStyleModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "1.2.0",
       "_view_name": "StyleView",
       "bar_color": null,
       "description_width": "initial"
      }
     },
     "08aa3cf7416643cebec8dc2234a34543": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "HBoxModel",
      "state": {
       "_dom_classes": [],
       "_model_module": "@jupyter-widgets/controls",
       "_model_module_version": "1.5.0",
       "_model_name": "HBoxModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/controls",
       "_view_module_version": "1.5.0",
       "_view_name": "HBoxView",
       "box_style": "",
       "children": [
        "IPY_MODEL_48997afeb7a640819c1a6ed50420047b",
        "IPY_MODEL_79f35e7333ed4d198f6fc1fe1227306b"
       ],
       "layout": "IPY_MODEL_d001a8c9eadc4dccad3a3b8951ab405d"
      }
     },
     "0d9b836ae97b4e5c927095a11dbe6eca": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "HTMLModel",
      "state": {
       "_dom_classes": [],
       "_model_module": "@jupyter-widgets/controls",
       "_model_module_version": "1.5.0",
       "_model_name": "HTMLModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/controls",
       "_view_module_version": "1.5.0",
       "_view_name": "HTMLView",
       "description": "",
       "description_tooltip": null,
       "layout": "IPY_MODEL_b0b6d32c39f74ff6abdc233a9f205c56",
       "placeholder": "​",
       "style": "IPY_MODEL_1b06f014ac2e45ac90dd5c8d7d35fa38",
       "value": " 2/2 [00:33&lt;00:00, 16.87s/it]"
      }
     },
     "1b06f014ac2e45ac90dd5c8d7d35fa38": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "DescriptionStyleModel",
      "state": {
       "_model_module": "@jupyter-widgets/controls",
       "_model_module_version": "1.5.0",
       "_model_name": "DescriptionStyleModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "1.2.0",
       "_view_name": "StyleView",
       "description_width": ""
      }
     },
     "48997afeb7a640819c1a6ed50420047b": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "FloatProgressModel",
      "state": {
       "_dom_classes": [],
       "_model_module": "@jupyter-widgets/controls",
       "_model_module_version": "1.5.0",
       "_model_name": "FloatProgressModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/controls",
       "_view_module_version": "1.5.0",
       "_view_name": "ProgressView",
       "bar_style": "success",
       "description": "100%",
       "description_tooltip": null,
       "layout": "IPY_MODEL_e1fe9971599a4274815d0b480472aa38",
       "max": 2,
       "min": 0,
       "orientation": "horizontal",
       "style": "IPY_MODEL_b00f42aa8ef8436a8208220f6cd8627b",
       "value": 2
      }
     },
     "6c9964c6cf604cf286e09990f8b39726": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "HBoxModel",
      "state": {
       "_dom_classes": [],
       "_model_module": "@jupyter-widgets/controls",
       "_model_module_version": "1.5.0",
       "_model_name": "HBoxModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/controls",
       "_view_module_version": "1.5.0",
       "_view_name": "HBoxView",
       "box_style": "",
       "children": [
        "IPY_MODEL_8fdfbd9fcb1d4060bd1596af8ad6cdbe",
        "IPY_MODEL_0d9b836ae97b4e5c927095a11dbe6eca"
       ],
       "layout": "IPY_MODEL_fe60ff5e7af84eb98dac93936ee5447b"
      }
     },
     "79f35e7333ed4d198f6fc1fe1227306b": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "HTMLModel",
      "state": {
       "_dom_classes": [],
       "_model_module": "@jupyter-widgets/controls",
       "_model_module_version": "1.5.0",
       "_model_name": "HTMLModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/controls",
       "_view_module_version": "1.5.0",
       "_view_name": "HTMLView",
       "description": "",
       "description_tooltip": null,
       "layout": "IPY_MODEL_e1be67b1e80d482888a1bc7a37b225cc",
       "placeholder": "​",
       "style": "IPY_MODEL_e70ee7bae4774c959d488e3360a175f6",
       "value": " 2/2 [00:17&lt;00:00,  8.96s/it]"
      }
     },
     "8fdfbd9fcb1d4060bd1596af8ad6cdbe": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "FloatProgressModel",
      "state": {
       "_dom_classes": [],
       "_model_module": "@jupyter-widgets/controls",
       "_model_module_version": "1.5.0",
       "_model_name": "FloatProgressModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/controls",
       "_view_module_version": "1.5.0",
       "_view_name": "ProgressView",
       "bar_style": "success",
       "description": "100%",
       "description_tooltip": null,
       "layout": "IPY_MODEL_e977525dd1d9429d94bdb4df1b24fc65",
       "max": 2,
       "min": 0,
       "orientation": "horizontal",
       "style": "IPY_MODEL_01d62b9e9f9444f899b4899e4798fea8",
       "value": 2
      }
     },
     "b00f42aa8ef8436a8208220f6cd8627b": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "ProgressStyleModel",
      "state": {
       "_model_module": "@jupyter-widgets/controls",
       "_model_module_version": "1.5.0",
       "_model_name": "ProgressStyleModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "1.2.0",
       "_view_name": "StyleView",
       "bar_color": null,
       "description_width": "initial"
      }
     },
     "b0b6d32c39f74ff6abdc233a9f205c56": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {
       "_model_module": "@jupyter-widgets/base",
       "_model_module_version": "1.2.0",
       "_model_name": "LayoutModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "1.2.0",
       "_view_name": "LayoutView",
       "align_content": null,
       "align_items": null,
       "align_self": null,
       "border": null,
       "bottom": null,
       "display": null,
       "flex": null,
       "flex_flow": null,
       "grid_area": null,
       "grid_auto_columns": null,
       "grid_auto_flow": null,
       "grid_auto_rows": null,
       "grid_column": null,
       "grid_gap": null,
       "grid_row": null,
       "grid_template_areas": null,
       "grid_template_columns": null,
       "grid_template_rows": null,
       "height": null,
       "justify_content": null,
       "justify_items": null,
       "left": null,
       "margin": null,
       "max_height": null,
       "max_width": null,
       "min_height": null,
       "min_width": null,
       "object_fit": null,
       "object_position": null,
       "order": null,
       "overflow": null,
       "overflow_x": null,
       "overflow_y": null,
       "padding": null,
       "right": null,
       "top": null,
       "visibility": null,
       "width": null
      }
     },
     "d001a8c9eadc4dccad3a3b8951ab405d": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {
       "_model_module": "@jupyter-widgets/base",
       "_model_module_version": "1.2.0",
       "_model_name": "LayoutModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "1.2.0",
       "_view_name": "LayoutView",
       "align_content": null,
       "align_items": null,
       "align_self": null,
       "border": null,
       "bottom": null,
       "display": null,
       "flex": null,
       "flex_flow": null,
       "grid_area": null,
       "grid_auto_columns": null,
       "grid_auto_flow": null,
       "grid_auto_rows": null,
       "grid_column": null,
       "grid_gap": null,
       "grid_row": null,
       "grid_template_areas": null,
       "grid_template_columns": null,
       "grid_template_rows": null,
       "height": null,
       "justify_content": null,
       "justify_items": null,
       "left": null,
       "margin": null,
       "max_height": null,
       "max_width": null,
       "min_height": null,
       "min_width": null,
       "object_fit": null,
       "object_position": null,
       "order": null,
       "overflow": null,
       "overflow_x": null,
       "overflow_y": null,
       "padding": null,
       "right": null,
       "top": null,
       "visibility": null,
       "width": null
      }
     },
     "e1be67b1e80d482888a1bc7a37b225cc": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {
       "_model_module": "@jupyter-widgets/base",
       "_model_module_version": "1.2.0",
       "_model_name": "LayoutModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "1.2.0",
       "_view_name": "LayoutView",
       "align_content": null,
       "align_items": null,
       "align_self": null,
       "border": null,
       "bottom": null,
       "display": null,
       "flex": null,
       "flex_flow": null,
       "grid_area": null,
       "grid_auto_columns": null,
       "grid_auto_flow": null,
       "grid_auto_rows": null,
       "grid_column": null,
       "grid_gap": null,
       "grid_row": null,
       "grid_template_areas": null,
       "grid_template_columns": null,
       "grid_template_rows": null,
       "height": null,
       "justify_content": null,
       "justify_items": null,
       "left": null,
       "margin": null,
       "max_height": null,
       "max_width": null,
       "min_height": null,
       "min_width": null,
       "object_fit": null,
       "object_position": null,
       "order": null,
       "overflow": null,
       "overflow_x": null,
       "overflow_y": null,
       "padding": null,
       "right": null,
       "top": null,
       "visibility": null,
       "width": null
      }
     },
     "e1fe9971599a4274815d0b480472aa38": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {
       "_model_module": "@jupyter-widgets/base",
       "_model_module_version": "1.2.0",
       "_model_name": "LayoutModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "1.2.0",
       "_view_name": "LayoutView",
       "align_content": null,
       "align_items": null,
       "align_self": null,
       "border": null,
       "bottom": null,
       "display": null,
       "flex": null,
       "flex_flow": null,
       "grid_area": null,
       "grid_auto_columns": null,
       "grid_auto_flow": null,
       "grid_auto_rows": null,
       "grid_column": null,
       "grid_gap": null,
       "grid_row": null,
       "grid_template_areas": null,
       "grid_template_columns": null,
       "grid_template_rows": null,
       "height": null,
       "justify_content": null,
       "justify_items": null,
       "left": null,
       "margin": null,
       "max_height": null,
       "max_width": null,
       "min_height": null,
       "min_width": null,
       "object_fit": null,
       "object_position": null,
       "order": null,
       "overflow": null,
       "overflow_x": null,
       "overflow_y": null,
       "padding": null,
       "right": null,
       "top": null,
       "visibility": null,
       "width": null
      }
     },
     "e70ee7bae4774c959d488e3360a175f6": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "DescriptionStyleModel",
      "state": {
       "_model_module": "@jupyter-widgets/controls",
       "_model_module_version": "1.5.0",
       "_model_name": "DescriptionStyleModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "1.2.0",
       "_view_name": "StyleView",
       "description_width": ""
      }
     },
     "e977525dd1d9429d94bdb4df1b24fc65": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {
       "_model_module": "@jupyter-widgets/base",
       "_model_module_version": "1.2.0",
       "_model_name": "LayoutModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "1.2.0",
       "_view_name": "LayoutView",
       "align_content": null,
       "align_items": null,
       "align_self": null,
       "border": null,
       "bottom": null,
       "display": null,
       "flex": null,
       "flex_flow": null,
       "grid_area": null,
       "grid_auto_columns": null,
       "grid_auto_flow": null,
       "grid_auto_rows": null,
       "grid_column": null,
       "grid_gap": null,
       "grid_row": null,
       "grid_template_areas": null,
       "grid_template_columns": null,
       "grid_template_rows": null,
       "height": null,
       "justify_content": null,
       "justify_items": null,
       "left": null,
       "margin": null,
       "max_height": null,
       "max_width": null,
       "min_height": null,
       "min_width": null,
       "object_fit": null,
       "object_position": null,
       "order": null,
       "overflow": null,
       "overflow_x": null,
       "overflow_y": null,
       "padding": null,
       "right": null,
       "top": null,
       "visibility": null,
       "width": null
      }
     },
     "fe60ff5e7af84eb98dac93936ee5447b": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {
       "_model_module": "@jupyter-widgets/base",
       "_model_module_version": "1.2.0",
       "_model_name": "LayoutModel",
       "_view_count": null,
       "_view_module": "@jupyter-widgets/base",
       "_view_module_version": "1.2.0",
       "_view_name": "LayoutView",
       "align_content": null,
       "align_items": null,
       "align_self": null,
       "border": null,
       "bottom": null,
       "display": null,
       "flex": null,
       "flex_flow": null,
       "grid_area": null,
       "grid_auto_columns": null,
       "grid_auto_flow": null,
       "grid_auto_rows": null,
       "grid_column": null,
       "grid_gap": null,
       "grid_row": null,
       "grid_template_areas": null,
       "grid_template_columns": null,
       "grid_template_rows": null,
       "height": null,
       "justify_content": null,
       "justify_items": null,
       "left": null,
       "margin": null,
       "max_height": null,
       "max_width": null,
       "min_height": null,
       "min_width": null,
       "object_fit": null,
       "object_position": null,
       "order": null,
       "overflow": null,
       "overflow_x": null,
       "overflow_y": null,
       "padding": null,
       "right": null,
       "top": null,
       "visibility": null,
       "width": null
      }
     }
    },
    "version_major": 2,
    "version_minor": 0
   }
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
